import { defineStore } from 'pinia';

interface piniaStore {
  counter: number,
  name?: string,
  isAdmin?: boolean
}

const usePiniaStore = defineStore('piniaStore', {
  // 推荐使用 完整类型推断的箭头函数
  state: () => {
    return {
      // 所有这些属性都将自动推断其类型
      counter: 0,
      name: 'Eduardo',
      isAdmin: true,
    } as piniaStore
  },
  getters: {
    doubleCounter: state => state.counter * 2,
    // 自动将返回类型推断为数字
    doubleCount(state) {
      return state.counter * 2
    },
    // 返回类型必须明确设置
    /* 我们可以在定义常规函数时通过 this 访问到 整个 store 的实例， 但是需要定义返回类型（在 TypeScript 中）。 
    这是由于 TypeScript 中的一个已知限制，并且不会影响使用箭头函数定义的 getter，也不会影响不使用 this 的 getter */
    doublePlusOne(): number {
      return this.counter * 2 + 1
    },
    // 将参数传递给 getter
    getNewCounter(state) {
      return (val: number) => val + state.counter
    }
  },
  actions: {
    increment() {
      this.counter++
    },
  },
  // 开启数据缓存
  persist: true
})
export default usePiniaStore
